﻿//==============================================================================
// File: CommandLineParser.cs
// Created: 2010-05-28
// Author: Piotr Włodek, Arkadiusz Świerczek
//==============================================================================
// This file is a part of MAMMOTH project.
// Copyright (C) 2010 AGH University of Science and Technology, Krakow.
// https://caribou.iisg.agh.edu.pl/trac/mammoth
//
// Mammoth is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// 
// Mammoth is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU Lesser General Public License for more details.
// 
// You should have received a copy of the GNU Lesser General Public License
// along with Mammoth. If not, see http://www.gnu.org/licenses/.
//==============================================================================

using System;
using System.Collections.Generic;
using System.ComponentModel.Composition;
using WpfRcp.Core.Common.CommandLine;
using WpfRcp.Core.Services;

namespace WpfRcp.Services
{
    internal class CommandLineParser : ICommandLineParser
    {
        [ImportMany]
        public IEnumerable<Command> Commands { get; set; }

        private readonly IRcpSettings m_RcpSettings;

        public CommandLineParser(IRcpSettings rcpSettings)
        {
            m_RcpSettings = rcpSettings;
        }

        public void Parse(IList<string> args)
        {
            if (args.Count > 0)
            {
                var requiresConsole = false;
                var requiresRestart = false;
                var commands = new List<Command>();

                try
                {
                    foreach (var command in Commands)
                    {
                        command.ParseArguments(args);
                        if (command.CanExecute())
                        {
                            commands.Add(command);

                            if (command.RequiresConsole)
                                requiresConsole = true;
                            if (command.RequiresRestart)
                                requiresRestart = true;
                        }
                    }
                }
                catch
                {
                    commands.Clear();
                }

                if (commands.Count == 0)
                {
                    ConsoleManager.Show();
                    PrintInfo();
                    PrintHelp();

                    Console.WriteLine(Properties.Resources.CommandLineParser_HitAnyKey);
                    Console.ReadKey();
                    ConsoleManager.Hide();

                    return;
                }

                if (requiresConsole)
                {
                    ConsoleManager.Show();
                    PrintInfo();
                }

                try
                {
                    foreach (var command in commands)
                    {
                        command.Execute();
                    }
                }
                catch (Exception)
                {
                    if (!requiresConsole)
                    {
                        ConsoleManager.Show();
                        PrintInfo();
                    }
                    PrintHelp();
                    Environment.Exit(-1);
                }

                if (requiresRestart)
                    Environment.Exit(0);

                if (ConsoleManager.HasConsole)
                {
                    Console.WriteLine(Properties.Resources.CommandLineParser_HitAnyKey);
                    Console.ReadKey();
                    ConsoleManager.Hide();
                }
            }
        }

        private void PrintInfo()
        {
            Console.WriteLine(m_RcpSettings.TaskBarAppName);
            Console.WriteLine(m_RcpSettings.AnsiCopyright);
            Console.WriteLine();
        }

        private void PrintHelp()
        {
            WpfRcp.Core.Common.CommandLine.CommandLineParser.PrintCommands(Commands);
            Console.ReadKey();
        }
    }
}